package models

import (
	"bigdevops/src/common"
	"fmt"
	"gorm.io/gorm"
	"gorm.io/gorm/clause"
)

/*用户相关的数据库 字段
基于前端依赖的user 字段
    {
     userId: '2',
     username: 'test',
     password: '123456',
     realName: 'test user',
     avatar: '',
     desc: 'tester',
     token: 'fakeToken2',
     homePath: '/dashboard/workbench',
     roles: [
       {
         roleName: 'Tester',
         value: 'test',
       },
     ],
   },
*/

type User struct {
	Model               // 包含ID、CreatedAt、UpdatedAt字段
	UserId       int    `json:"userId" gorm:"comment:用户id"`
	Username     string `json:"username" gorm:"type:varchar(100);uniqueIndex;comment:用户登录名"` // 用户登录名，唯一索引
	Password     string `json:"password"  gorm:"comment:用户登录密码"`
	RealName     string `json:"realName" gorm:"type:varchar(100);uniqueIndex;comment:用户昵称 中文名"`
	Desc         string `json:"desc" gorm:"comment:用户描述"`
	Mobile       string `json:"mobile" gorm:"comment:手机号"`
	FeiShuUserId string `json:"feiShuUserId" gorm:"comment:飞书userid 获取方式请看 https://open.feishu.cn/document/home/user-identity-introduction/open-id"`
	// 添加一些字段用来支持服务账号
	AccountType         int    `json:"accountType" gorm:"default:1;comment:用户是否是服务账号 1普通用户 2服务账号"`
	ServiceAccountToken string `json:"serviceAccountToken"`

	HomePath      string       `json:"homePath" gorm:"comment:登陆后的默认首页"`
	Enable        int          `json:"enable" gorm:"default:1;comment:用户是否被冻结 1正常 2冻结"` // 用户是否被冻结，1正常，2冻结
	Roles         []*Role      `json:"roles" gorm:"many2many:user_roles;"`              // 多对多关系
	OpsNodes      []*StreeNode `json:"ops_nodes" gorm:"many2many:ops_admins;"`          // 多对多关系
	RdAdminNodes  []*StreeNode `json:"rd_admin_nodes" gorm:"many2many:rd_admins;"`      // 多对多关系
	RdMemberNodes []*StreeNode `json:"rd_member_nodes" gorm:"many2many:rd_members;"`    // 多对多关系

	StaticReceiveUsers []*MonitorSendGroup   `json:"staticReceiveUsers" gorm:"many2many:static_receive_users;"` // 多对多关系
	FirstUpgradeUsers  []*MonitorSendGroup   `json:"firstUpgradeUsers" gorm:"many2many:first_upgrade_users;"`   // 多对多关系
	MonitorOndutyUsers []*MonitorOndutyGroup `json:"monitorOndutyUsers" gorm:"many2many:monitor_onduty_users;"` // 多对多关系

	Processes          []Process
	workOrderTemplates []FormDesign
	RolesFront         []string `json:"rolesFront" gorm:"-"` // 给前端用的中间字段
	//RoleID   uint      // 属于哪个role
	//Role     Role      // 属于哪个role

	//Phone  string  `json:"phone"  gorm:"comment:用户手机号"`                     // 用户手机号
	//Email  string  `json:"email"  gorm:"comment:用户邮箱"`                      // 用户邮箱

}

// CheckUserPassword 验证用户登录密码
func CheckUserPassword(ru *UserLoginRequest) (*User, error) {
	var dbUser User
	// 根据用户名查询用户信息，并预加载用户角色
	err := Db.Where("username = ?", ru.Username).Preload("Roles").First(&dbUser).Error
	if err != nil {
		if err == gorm.ErrRecordNotFound {
			return nil, fmt.Errorf("用户名不存在")
		}
		return nil, fmt.Errorf("数据库错误:%w", err)
	}

	// 对比用户密码
	ok := common.BcryptCheck(ru.Password, dbUser.Password)
	if ok {
		return &dbUser, nil
	}
	return nil, fmt.Errorf("密码错误")
}

// GetUserByUserName 根据用户名获取用户信息
func GetUserByUserName(userName string) (*User, error) {
	var dbUser User
	// 根据用户名查询用户信息，并预加载用户角色及其菜单
	//err := Db.Where("username = ?", userName).Preload("Roles").Joins("Menus").First(&dbUser).Error
	err := Db.Where("username = ?", userName).Preload("Roles").Preload("Roles.Menus").First(&dbUser).Error
	if err != nil {
		if err == gorm.ErrRecordNotFound {
			return nil, fmt.Errorf("用户名不存在")
		}
		return nil, fmt.Errorf("数据库错误:%w", err)
	}
	return &dbUser, nil
}

// UpdateOne 更新用户信息及其角色
func (obj *User) UpdateOne(roles []*Role) error {
	// 更新用户信息
	//return Db.Session(&gorm.Session{FullSaveAssociations: true}).Updates(obj).Error
	//return Db.Model(obj).Association("Roles").Replace(roles)
	//err1 := Db.Where("id = ?", obj.ID).Updates(User{Desc: obj.Desc, RealName: obj.RealName}).Error
	err1 := Db.Where("id = ?", obj.ID).Updates(obj).Error
	// 更新用户角色关联
	err2 := Db.Model(obj).Association("Roles").Replace(roles)
	if err1 == nil && err2 == nil {
		return nil
	} else {
		return fmt.Errorf("更新本体:%w 更新关联:%w", err1, err2)
	}
}

// FirstOrCreate 查找或创建用户
func (obj *User) FirstOrCreate() error {
	return Db.Debug().Where(User{Username: obj.Username}).FirstOrCreate(obj).Error
}

// UpdateRoles 更新用户角色
func (obj *User) UpdateRoles(roles []*Role) error {
	//return Db.Session(&gorm.Session{FullSaveAssociations: true}).Updates(obj).Error
	return Db.Model(obj).Association("Roles").Replace(roles)
	//return Db.Updates(obj).Error
}

// CreateOne 创建用户
func (obj *User) CreateOne() error {
	return Db.Create(obj).Error
}

// GetUserAll 获取所有用户
func GetUserAll() (users []*User, err error) {
	err = Db.Preload("Roles").Find(&users).Error
	return
}

// GetUserById 根据用户ID获取用户信息
func GetUserById(id int) (*User, error) {
	var dbUser User
	// 根据用户ID查询用户信息，并预加载用户角色
	//err := Db.Where("username = ?", userName).Preload("Roles").Joins("Menus").First(&dbUser).Error
	err := Db.Where("id = ?", id).Preload("Roles").First(&dbUser).Error
	if err != nil {
		if err == gorm.ErrRecordNotFound {
			return nil, fmt.Errorf("用户不存在")
		}
		return nil, fmt.Errorf("数据库错误:%w", err)
	}
	return &dbUser, nil
}

// GetUserByName 根据用户名获取用户信息
func GetUserByName(name string) (*User, error) {
	var dbUser User
	// 根据用户名查询用户信息，并预加载用户角色
	//err := Db.Where("username = ?", userName).Preload("Roles").Joins("Menus").First(&dbUser).Error
	err := Db.Where("username = ?", name).Preload("Roles").First(&dbUser).Error
	if err != nil {
		if err == gorm.ErrRecordNotFound {
			return nil, fmt.Errorf("用户不存在")
		}
		return nil, fmt.Errorf("数据库错误:%w", err)
	}
	return &dbUser, nil
}

// DeleteOne 删除用户
func (obj *User) DeleteOne() error {
	return Db.Select(clause.Associations).Unscoped().Delete(obj).Error
}
